package pe.com.bbva.modpre.persistencia.hibernate;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.persistencia.EquipoDAO;
import pe.com.bbva.modpre.utileria.Busqueda;

@Repository
@SuppressWarnings("serial")
public class EquipoHibernate extends BaseHibernate<Equipo, Long> 
	implements EquipoDAO{

	@Value("${jdbc.schema}")
	private String schema;

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public String obtenerObjetoBBDD(String objetoBBDD) {
		return schema+"."+objetoBBDD;
	}
	
	@Autowired
	public EquipoHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}	
	
	@Override
	public Equipo obtenerEquipoxUsuario(Usuario usuario) {
		return obtenerHql("select i.equipo from Integrante i where i.usuario.id=?", usuario.getId());
	}

	@Override
	public Equipo obtenerEquipoxCodigo(String codigo) {
		return obtenerHql("select e from Equipo e where codigo=?", codigo);
	}

	@Override
	public List<Equipo> busquedaFiltrada(Map<String, Object> mapFiltro) {
		
		List<String> alias=new ArrayList<String>();
		Busqueda filtro = Busqueda.forClass(Equipo.class);
		if(mapFiltro.containsKey("item") && StringUtils.isNotBlank((String)mapFiltro.get("item")) 
				&& StringUtils.isNumeric((String)mapFiltro.get("item"))){
			filtro.add(Restrictions.eq("id",Long.parseLong((String)mapFiltro.get("item"))));
		}
		if(mapFiltro.containsKey("nroSolicitud") && StringUtils.isNotBlank((String)mapFiltro.get("nroSolicitud"))){
			filtro.createAlias("solicitud", "s");
			alias.add("s");
			filtro.add(Restrictions.ilike("s.numero",(String)mapFiltro.get("nroSolicitud"), MatchMode.ANYWHERE));
		}
		
		filtro.addOrder(Order.asc("id"));
		return buscar(filtro);
	}

	@Override
	public List<Equipo> busquedaEquipos(Equipo equipo) {
		List<String> alias=new ArrayList<String>();
		Busqueda filtro = Busqueda.forClass(Equipo.class);
		if(equipo!=null){
			if(equipo.getId()!=null){
				filtro.add(Restrictions.eq("id",
						equipo.getId()));
			}
			if(equipo.getCodigo()!=null){
				filtro.add(Restrictions.ilike("codigo",
						equipo.getCodigo(), MatchMode.ANYWHERE));
			}
			if(equipo.getNombre()!=null){
				filtro.add(Restrictions.ilike("nombre",
						equipo.getNombre(), MatchMode.ANYWHERE));
			}
			if(equipo.getEstado()!=null){
				filtro.createAlias("estado", "e");
				alias.add("e");
				filtro.add(Restrictions.ilike("e.nombre",
						equipo.getEstado().getNombre(), MatchMode.ANYWHERE));
			}
			
			
		}
		filtro.addOrder(Order.asc("id"));
		filtro.addOrder(Order.asc("padre"));
		return buscar(filtro);
	}

	@Override
	public Map<String, Integer> obtenerNivelEquipos() {
		Map<String, Integer> map=new HashMap<String, Integer>();
		
		StringBuilder sql=new StringBuilder();
		sql.append("select LEVEL, ID, PADRE, CODIGO from ");
		sql.append(obtenerObjetoBBDD("org_equipo")+" ");
		sql.append("T START WITH PADRE is null ");
		sql.append("CONNECT BY T.PADRE = PRIOR T.ID ");
		
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString());
		
		for (Map<String, Object> row : rows) {
			map.put((String)row.get("CODIGO"), ((BigDecimal)row.get("LEVEL")).intValue());
		}
		return map;
	}

	@Override
	public List<Equipo> obtenerEquiposxPadre(Equipo equipo) {
		return buscarHql("select e from Equipo e where padre.id=?", equipo.getId());
	}

	@Override
	public Equipo obtenerEquipoxRegistroUsuario(String registro) {
		return obtenerHql("select i.equipo from Integrante i where i.usuario.registro=?", registro);
	}

	@Override
	public Object[] obtenerEquiposLista(String codigo) {
		StringBuilder sql=new StringBuilder();
		sql.append("select * from ");
		sql.append(obtenerObjetoBBDD("org_equipo")+" ");
		sql.append("T START WITH CODIGO=? ");
		sql.append("CONNECT BY T.PADRE = PRIOR T.ID ");
		
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString(),codigo);
		if(rows.size()!=0){
			Object[] equipos=new Object[rows.size()-1];
			int con=0;
			for (Map<String, Object> row : rows) {
				if(!row.get("CODIGO").equals(codigo)){
					equipos[con++]=row.get("CODIGO");
				}
			}
			return equipos;	
		}
		return null;
	}
	
}
